#include "all.h"

libco::Mutex mu;

libco::ConditionVariable cv;
bool ready = false;

void print_id(int id) {
    libco::Mutex::Lock lck(mu);
    cv.wait(lck, [] { return ready; });  // 等待直到 ready 为 true
    // 当 ready 为 true 时，上面的 wait 调用会返回
    LIBCO_LOG << "Thread " << id << " is running";
}

/**
 * @brief 测试唤醒所有线程，线程执行顺序不一定，说明不是FIFO
 * 
 */
void test_notify_all() {
    ready = false;
    int threads_num = 10;
    libco::Thread::ptr threads[threads_num];

    // 启动线程
    for (int i = 0; i < threads_num; ++i) {
        threads[i] = std::make_shared<libco::Thread>(std::bind(print_id, i), "thread_" + std::to_string(i));
    }

    // 模拟一些工作
    std::this_thread::sleep_for(std::chrono::seconds(1)); 

    {
        libco::Mutex::Lock lck(mu);
        ready = true;  // 通知所有线程可以开始工作
        cv.notify_all();  // 唤醒所有等待的线程
    }

    // 等待所有线程完成
    for (int i = 0; i < threads_num; ++i) {
        threads[i]->join();
    }

    LIBCO_LOG << "main thread finished";
}

/**
 * @brief 测试只唤醒一个线程，其他线程仍处于休眠状态
 * 
 */
void test_notify_one() {
    int threads_num = 10;
    ready = false;
    libco::Thread::ptr threads[threads_num];

    // 启动线程
    for (int i = 0; i < threads_num; ++i) {
        threads[i] = std::make_shared<libco::Thread>(std::bind(print_id, i), "thread_" + std::to_string(i));
    }

    // 模拟一些工作
    std::this_thread::sleep_for(std::chrono::seconds(1)); 

    {
        libco::Mutex::Lock lck(mu);
        ready = true;  
    }
    cv.notify_one();  // 唤醒一个等待的线程

    // 等待所有线程完成
    for (int i = 0; i < threads_num; ++i) {
        threads[i]->join();
    }

    LIBCO_LOG << "main thread finished";
}
int main() {
    test_notify_all();
    // test_notify_one();
    return 0;
}